use anyhow::{Error, Ok, Result};
use dotenv::var;
use redis::aio::ConnectionManager;

#[derive(Clone)]
pub struct Redis {
    pub connection_manager: ConnectionManager,
}

impl Redis {
    pub async fn new() -> Result<Self, Error> {
        let url = var("REDIS_URL")?;
        let connection_manager = redis::Client::open(url)?.get_connection_manager().await?;
        Ok(Self { connection_manager })
    }
}

// 课堂正在进行（set）
pub fn space_key_active() -> String {
    "space:active".into()
}

// 课堂在线（hash_ex）
pub fn space_key_online() -> String {
    "space:online".into()
}

// 课堂基本信息（json）
pub fn space_key_basic(space_id: i64) -> String {
    format!("space:basic:{}", space_id)
}

// 课堂内容更新锁（hash_ex）
pub fn space_key_lock() -> String {
    "space:lock".into()
}

// 课堂内容（json）
pub fn space_key_state(space_id: i64) -> String {
    format!("space:state:{}", space_id)
}

// 课堂内容版本（string）
pub fn space_key_state_ver(space_id: i64) -> String {
    format!("space:state:ver:{}", space_id)
}

// 课堂参与人员权限（sorted_set, score's meaning: 2 - teacher, 1 - student can operate, 0 - student cannot operate）
pub fn space_key_perms(space_id: i64) -> String {
    format!("space:perms:{}", space_id)
}

// 课堂参与人员信息（hash）
pub fn space_key_users(space_id: i64) -> String {
    format!("space:users:{}", space_id)
}

// 课堂参与人员在线情况（hash_ex）
pub fn space_key_pings(space_id: i64) -> String {
    format!("space:pings:{}", space_id)
}
